package com.ruoyi.common.mybatisplus.handler;

/**
 * @Auther: tswsoft
 * @Date: 2021/03/23/1:02 PM
 * @Description:
 */

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.utils.LocalUserUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 处理新增和更新的基础数据填充，配合BaseEntity和MyBatisPlusConfig使用
 */
@Component
public class MyMetaHandler implements MetaObjectHandler {

    /**
     * 新增数据执行
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {

        // 如果创建时间为空,则默认进行设置,否则使用自己的创建时间
        if (StringUtils.isNull(this.getFieldValByName("createTime",metaObject))){
            this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        }

        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);

        // 新增人
        if(StringUtils.isNull(this.getFieldValByName("createById",metaObject))){
            this.setFieldValByName("createBy", SecurityUtils.getRealName(), metaObject);
            this.setFieldValByName("createById", SecurityUtils.getUserId(), metaObject);
        }
        if(StringUtils.isNull(this.getFieldValByName("createById",metaObject))){
            this.setFieldValByName("createBy", LocalUserUtils.getRealName(), metaObject);
            this.setFieldValByName("createById", LocalUserUtils.getUserId(), metaObject);
        }

        // 修改人
        if(StringUtils.isNull(this.getFieldValByName("updateById",metaObject))) {
            this.setFieldValByName("updateById", SecurityUtils.getUserId(), metaObject);
            this.setFieldValByName("updateBy", SecurityUtils.getRealName(), metaObject);
        }
        if(StringUtils.isNull(this.getFieldValByName("updateById",metaObject))) {
            this.setFieldValByName("updateById", LocalUserUtils.getUserId(), metaObject);
            this.setFieldValByName("updateBy", LocalUserUtils.getRealName(), metaObject);
        }

        // 所属公司
        if(StringUtils.isNull(this.getFieldValByName("companyId",metaObject))) {
            this.setFieldValByName("companyId", SecurityUtils.getCompanyId(), metaObject);
            this.setFieldValByName("companyName", SecurityUtils.getCompanyName(), metaObject);
        }
        if(StringUtils.isNull(this.getFieldValByName("companyId",metaObject))) {
            this.setFieldValByName("companyId", LocalUserUtils.getCompanyId(), metaObject);
            this.setFieldValByName("companyName", LocalUserUtils.getCompanyName(), metaObject);
        }

        // 所属部门为空的时候默认登陆人所属部门
        if(StringUtils.isNull(this.getFieldValByName("deptId",metaObject))){
            this.setFieldValByName("deptId", SecurityUtils.getDeptId(), metaObject);
            this.setFieldValByName("deptName", SecurityUtils.getDeptName(), metaObject);
        }
        if(StringUtils.isNull(this.getFieldValByName("deptId",metaObject))){
            this.setFieldValByName("deptId", LocalUserUtils.getDeptId(), metaObject);
            this.setFieldValByName("deptName", LocalUserUtils.getDeptName(), metaObject);
        }

        // 所有者为空的时候默认登陆人
        if(StringUtils.isNull(this.getFieldValByName("ownerId",metaObject))){
            this.setFieldValByName("ownerId", SecurityUtils.getUserId(), metaObject);
            this.setFieldValByName("ownerName", SecurityUtils.getRealName(), metaObject);
        }
        if(StringUtils.isNull(this.getFieldValByName("ownerId",metaObject))){
            this.setFieldValByName("ownerId", LocalUserUtils.getUserId(), metaObject);
            this.setFieldValByName("ownerName", LocalUserUtils.getRealName(), metaObject);
        }
    }

    /**
     * 更新数据执行
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);

        // 修改人
        if(StringUtils.isNull(this.getFieldValByName("updateById",metaObject))) {
            this.setFieldValByName("updateById", SecurityUtils.getUserId(), metaObject);
            this.setFieldValByName("updateBy", SecurityUtils.getRealName(), metaObject);
        }
        if(StringUtils.isNull(this.getFieldValByName("updateById",metaObject))) {
            this.setFieldValByName("updateById", LocalUserUtils.getUserId(), metaObject);
            this.setFieldValByName("updateBy", LocalUserUtils.getRealName(), metaObject);
        }

    }

}
